//	---------------------------------------------------------------------------
//
//	@file		MiniSDL12.h
//	@brief		A subset of SDL 1.2 definitions needed to compile helper
//				functions implemented in TwEventSDL12.c
//
//	notes:	  - Private header
//			  - AntTweakBar.dll does not need to link with SDL,
//				it just needs some definitions for its helper functions.
//			  - This header is provided to avoid the need of having SDL
//				installed to recompile AntTweakBar.
//			  - Do not use this header in your own programs, better use the
//				SDL.h header from the actual SDL library SDK :
//				http://www.libsdl.org
//
//	---------------------------------------------------------------------------

#if !defined MINI_SDL12_INCLUDED
#define MINI_SDL12_INCLUDED

#ifdef __cplusplus
extern "C" {
#endif

#define SDL_MAJOR_VERSION	1
#define SDL_MINOR_VERSION	2

#if defined(_WIN32) || defined(_WIN64)
#	define SDL_DECLSPEC __declspec(dllimport)
#	define SDL_CALL __cdecl
#else
#	define SDL_DECLSPEC
#	define SDL_CALL
#endif

typedef unsigned char	Uint8;
typedef signed char		Sint8;
typedef unsigned short	Uint16;
typedef signed short	Sint16;
typedef unsigned int	Uint32;
typedef signed int		Sint32;

// Subset of SDL keysym
typedef enum {
	SDLK_BACKSPACE	= 8,
	SDLK_TAB		= 9,
	SDLK_CLEAR		= 12,
	SDLK_RETURN		= 13,
	SDLK_PAUSE		= 19,
	SDLK_ESCAPE		= 27,
	SDLK_DELETE		= 127,
	SDLK_UP			= 273,
	SDLK_DOWN		= 274,
	SDLK_RIGHT		= 275,
	SDLK_LEFT		= 276,
	SDLK_INSERT		= 277,
	SDLK_HOME		= 278,
	SDLK_END		= 279,
	SDLK_PAGEUP		= 280,
	SDLK_PAGEDOWN	= 281,
	SDLK_F1			= 282,
	SDLK_F2			= 283,
	SDLK_F3			= 284,
	SDLK_F4			= 285,
	SDLK_F5			= 286,
	SDLK_F6			= 287,
	SDLK_F7			= 288,
	SDLK_F8			= 289,
	SDLK_F9			= 290,
	SDLK_F10		= 291,
	SDLK_F11		= 292,
	SDLK_F12		= 293,
} SDLKey;

typedef enum {
	KMOD_NONE		= 0x0000,
	KMOD_LSHIFT		= 0x0001,
	KMOD_RSHIFT		= 0x0002,
	KMOD_LCTRL		= 0x0040,
	KMOD_RCTRL		= 0x0080,
	KMOD_LALT		= 0x0100,
	KMOD_RALT		= 0x0200,
	KMOD_LMETA		= 0x0400,
	KMOD_RMETA		= 0x0800,
	KMOD_NUM		= 0x1000,
	KMOD_CAPS		= 0x2000,
	KMOD_MODE		= 0x4000,
	KMOD_RESERVED	= 0x8000
} SDLMod;

#define KMOD_CTRL	(KMOD_LCTRL|KMOD_RCTRL)
#define KMOD_SHIFT	(KMOD_LSHIFT|KMOD_RSHIFT)
#define KMOD_ALT	(KMOD_LALT|KMOD_RALT)
#define KMOD_META	(KMOD_LMETA|KMOD_RMETA)

typedef enum {
	SDL_NOEVENT = 0,
	SDL_ACTIVEEVENT,
	SDL_KEYDOWN,
	SDL_KEYUP,
	SDL_MOUSEMOTION,
	SDL_MOUSEBUTTONDOWN,
	SDL_MOUSEBUTTONUP,
	SDL_JOYAXISMOTION,
	SDL_JOYBALLMOTION,
	SDL_JOYHATMOTION,
	SDL_JOYBUTTONDOWN,
	SDL_JOYBUTTONUP,
	SDL_QUIT,
	SDL_SYSWMEVENT,
	SDL_EVENT_RESERVEDA,
	SDL_EVENT_RESERVEDB,
	SDL_VIDEORESIZE,
	SDL_VIDEOEXPOSE,
	SDL_EVENT_RESERVED2,
	SDL_EVENT_RESERVED3,
	SDL_EVENT_RESERVED4,
	SDL_EVENT_RESERVED5,
	SDL_EVENT_RESERVED6,
	SDL_EVENT_RESERVED7,
	SDL_USEREVENT = 24,
	SDL_NUMEVENTS = 32
} SDLEventEnum;

typedef struct SDL_keysym {
	Uint8 scancode;
	SDLKey sym;
	SDLMod mod;
	Uint16 unicode;
} SDL_keysym;

typedef struct SDL_ActiveEvent {
	Uint8 type;
	Uint8 gain;
	Uint8 state;
} SDL_ActiveEvent;

typedef struct SDL_KeyboardEvent {
	Uint8 type;
	Uint8 which;
	Uint8 state;
	SDL_keysym keysym;
} SDL_KeyboardEvent;

typedef struct SDL_MouseMotionEvent {
	Uint8 type;
	Uint8 which;
	Uint8 state;
	Uint16 x, y;
	Sint16 xrel;
	Sint16 yrel;
} SDL_MouseMotionEvent;

typedef struct SDL_MouseButtonEvent {
	Uint8 type;
	Uint8 which;
	Uint8 button;
	Uint8 state;
	Uint16 x, y;
} SDL_MouseButtonEvent;

typedef struct SDL_JoyAxisEvent {
	Uint8 type;
	Uint8 which;
	Uint8 axis;
	Sint16 value;
} SDL_JoyAxisEvent;

typedef struct SDL_JoyBallEvent {
	Uint8 type;
	Uint8 which;
	Uint8 ball;
	Sint16 xrel;
	Sint16 yrel;
} SDL_JoyBallEvent;

typedef struct SDL_JoyHatEvent {
	Uint8 type;
	Uint8 which;
	Uint8 hat;
	Uint8 value;
} SDL_JoyHatEvent;

typedef struct SDL_JoyButtonEvent {
	Uint8 type;
	Uint8 which;
	Uint8 button;
	Uint8 state;
} SDL_JoyButtonEvent;

typedef struct SDL_ResizeEvent {
	Uint8 type;
	int w;
	int h;
} SDL_ResizeEvent;

typedef struct SDL_ExposeEvent {
	Uint8 type;
} SDL_ExposeEvent;

typedef struct SDL_QuitEvent {
	Uint8 type;
} SDL_QuitEvent;

typedef struct SDL_UserEvent {
	Uint8 type;
	int code;
	void *data1;
	void *data2;
} SDL_UserEvent;

struct SDL_SysWMmsg;
typedef struct SDL_SysWMmsg SDL_SysWMmsg;
typedef struct SDL_SysWMEvent {
	Uint8 type;
	SDL_SysWMmsg *msg;
} SDL_SysWMEvent;

typedef union {
	Uint8 type;
	SDL_ActiveEvent active;
	SDL_KeyboardEvent key;
	SDL_MouseMotionEvent motion;
	SDL_MouseButtonEvent button;
	SDL_JoyAxisEvent jaxis;
	SDL_JoyBallEvent jball;
	SDL_JoyHatEvent jhat;
	SDL_JoyButtonEvent jbutton;
	SDL_ResizeEvent resize;
	SDL_ExposeEvent expose;
	SDL_QuitEvent quit;
	SDL_UserEvent user;
	SDL_SysWMEvent syswm;
char full[56];
} SDL_Event;

typedef struct SDL_PixelFormat {
	void  *palette;
	Uint8  BitsPerPixel;
	Uint8  BytesPerPixel;
	Uint8  Rloss;
	Uint8  Gloss;
	Uint8  Bloss;
	Uint8  Aloss;
	Uint8  Rshift;
	Uint8  Gshift;
	Uint8  Bshift;
	Uint8  Ashift;
	Uint32 Rmask;
	Uint32 Gmask;
	Uint32 Bmask;
	Uint32 Amask;
	Uint32 colorkey;
	Uint8  alpha;
} SDL_PixelFormat;

typedef enum {
	SDL_GL_RED_SIZE,
	SDL_GL_GREEN_SIZE,
	SDL_GL_BLUE_SIZE,
	SDL_GL_ALPHA_SIZE,
	SDL_GL_BUFFER_SIZE,
	SDL_GL_DOUBLEBUFFER,
	SDL_GL_DEPTH_SIZE,
	SDL_GL_STENCIL_SIZE,
	SDL_GL_ACCUM_RED_SIZE,
	SDL_GL_ACCUM_GREEN_SIZE,
	SDL_GL_ACCUM_BLUE_SIZE,
	SDL_GL_ACCUM_ALPHA_SIZE,
	SDL_GL_STEREO,
	SDL_GL_MULTISAMPLEBUFFERS,
	SDL_GL_MULTISAMPLESAMPLES,
	SDL_GL_ACCELERATED_VISUAL,
	SDL_GL_RETAINED_BACKING,
	SDL_GL_CONTEXT_MAJOR_VERSION,
	SDL_GL_CONTEXT_MINOR_VERSION
} SDL_GLattr;

typedef struct SDL_VideoInfo {
	Uint32 hw_available :1;
	Uint32 wm_available :1;
	Uint32 UnusedBits1	:6;
	Uint32 UnusedBits2	:1;
	Uint32 blit_hw		:1;
	Uint32 blit_hw_CC	:1;
	Uint32 blit_hw_A	:1;
	Uint32 blit_sw		:1;
	Uint32 blit_sw_CC	:1;
	Uint32 blit_sw_A	:1;
	Uint32 blit_fill	:1;
	Uint32 UnusedBits3	:16;
	Uint32 video_mem;
	SDL_PixelFormat *vfmt;
	int current_w;
	int current_h;
} SDL_VideoInfo;

#define SDL_INIT_VIDEO	0x00000020

#define SDL_SWSURFACE	0x00000000
#define SDL_HWSURFACE	0x00000001
#define SDL_ASYNCBLIT	0x00000004
#define SDL_ANYFORMAT	0x10000000
#define SDL_HWPALETTE	0x20000000
#define SDL_DOUBLEBUF	0x40000000
#define SDL_FULLSCREEN	0x80000000
#define SDL_OPENGL		0x00000002
#define SDL_OPENGLBLIT	0x0000000A
#define SDL_RESIZABLE	0x00000010
#define SDL_NOFRAME		0x00000020

#define SDL_DEFAULT_REPEAT_DELAY	500
#define SDL_DEFAULT_REPEAT_INTERVAL 30


// functions subset
extern SDL_DECLSPEC int    SDL_CALL SDL_Init(Uint32 flags);
extern SDL_DECLSPEC void   SDL_CALL SDL_Quit();
extern SDL_DECLSPEC char * SDL_CALL SDL_GetError();
extern SDL_DECLSPEC const SDL_VideoInfo * SDL_CALL SDL_GetVideoInfo();
extern SDL_DECLSPEC struct SDL_Surface * SDL_CALL SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);
extern SDL_DECLSPEC int    SDL_CALL SDL_GL_SetAttribute(SDL_GLattr attr, int value);
extern SDL_DECLSPEC void   SDL_CALL SDL_GL_SwapBuffers();
extern SDL_DECLSPEC void   SDL_CALL SDL_WM_SetCaption(const char *title, const char *icon);
extern SDL_DECLSPEC void   SDL_CALL SDL_WM_GetCaption(char **title, char **icon);
extern SDL_DECLSPEC int    SDL_CALL SDL_EnableUNICODE(int enable);
extern SDL_DECLSPEC int    SDL_CALL SDL_EnableKeyRepeat(int delay, int interval);
extern SDL_DECLSPEC Uint32 SDL_CALL SDL_GetTicks();
extern SDL_DECLSPEC int    SDL_CALL SDL_PollEvent(SDL_Event *event);
extern SDL_DECLSPEC int    SDL_CALL SDL_WaitEvent(SDL_Event *event);
extern SDL_DECLSPEC int    SDL_CALL SDL_PushEvent(SDL_Event *event);


#ifdef __cplusplus
}
#endif

#endif // !defined MINI_SDL12_INCLUDED

